#include <iostream>
#include <vector>
#include <limits>

using namespace std;

class SegmentTree
{
public:
    SegmentTree(const vector<double>& array);

    double RMQ(int i, int j) const;

private:
    vector<double> data;
};

SegmentTree::SegmentTree(const vector<double>& array)
{
    // ищем наименьшую степень 2-ки, большую размера входного массива
    int nearestTwoPower = 0;
    // пока побитовым сдвигом вправо на nearestTwoPower битов
    // не получим 0, увеличиваем nearestTwoPower
	while (array.size() - 1 >> nearestTwoPower != 0)
    {
		nearestTwoPower++;
	}

    // находим размер массива дерева
	int size = 1 << nearestTwoPower;

    // размер массива дерева в 2 раза больше чем найденная степень 2-ки
	data.resize(2 * size, numeric_limits<double>::max());

	// заполняем листы дерева отрезков
	for (int i = size; i < 2 * size; ++i)
    {
		data[i] = array[i - size];
	}

	// детьми i-й вершины будут  2*i, 2*i+1
	// значение родителя - минимум из значений его детей
	for (int i = size - 1; i > 0; --i)
    {
		data[i] = min(data[i * 2], data[i * 2 + 1]);
	}
}

double SegmentTree::RMQ(int i, int j) const
{
	// сначала результат - бесконечность
	double result = numeric_limits<double>::max();

	// leafs - индекс массива, с которого начинаются листы
	int leafs = data.size() / 2;
	i += leafs;
	j += leafs - 1;

	// поднимаемся, пока i <= j
	while (i <= j)
    {
		// если i - правый сын, смотрим на значение в нем
		if (i & 1)
		{
			result = min(result, data[i]);
		}

		// если j - левый сын, смотрим на значение в нем
		if (!(j & 1))
		{
			result = min(result, data[j]);
		}

		// поднимаемся по дереву
		i = (i + 1) / 2;
		j = (j - 1) / 2;
	}
	return result;
}

int main()
{
    int arraySize, requestsNumber;
    vector<double> array;
    vector< pair<int, int> > borders;
    cin >> arraySize;

    array.resize(arraySize);
    for (int i = 0; i < arraySize; ++i)
    {
        cin >> array[i];
    }

    cin >> requestsNumber;
    borders.resize(requestsNumber);

    for (int i = 0; i < requestsNumber; ++i)
    {
        cin >> borders[i].first >> borders[i].second;
    }

    SegmentTree tree(array);

    for (int i = 0; i < requestsNumber; ++i)
    {
        cout << tree.RMQ(borders[i].first, borders[i].second) << " ";
    }

    return 0;
}
